function checksum = getCodeFileChecksum(modelName, varargin)
%GETCODEFILECHECKSUM 获取生成代码文件的校验和
%【语法】
%   checksum = getCodeFileChecksum(modelName)
%   checksum = getCodeFileChecksum(modelName, 'TreatAsTopMdl')
%
%【输入参数】
%   modelName        Simulink模型名称（字符串形式）
%
%【可选参数】
%   'TreatAsTopMdl'  （可选）顶层模型代码目录校验方式，省略时为引用模型模式
%
%【输出参数】
%   checksum         cell数组，每元素为一个生成源代码文件的校验值
%
%【实现说明】
%   - 自动判断代码目录路径，依据顶层/引用模式加载buildInfo.mat获得文件清单
%   - 仅计算非ert_main.c文件校验和，实现唯一性一致性校验
%   - 路径变量$(START_DIR)自动用真实路径替换（保持代码可移植性）
%   - 遇到文件缺失时，主动报错（符合DO-178错误处理要求）
%
%【典型用途】
%   - 自动化代码文件一致性校验
%   - DO-178C证据生成、追踪、回归比对和持续集成分析
%
%【约束与注意】
%   - 需确保已对目标模型完成代码生成，buildInfo.mat及文件结构完整
%   - 不存在的文件/异常将立即中断，抛出明确错误
%
%【依赖功能】
%   Simulink.fileGenControl, Simulink.getFileChecksum, load, fullfile, strrep
%
%【示例】
%   cs = getCodeFileChecksum('MyModel');
%   csTop = getCodeFileChecksum('MyModel', 'TreatAsTopMdl');
%   % 自动化一致性对比: isequal(cs, csTop)
%
%【相关参考】
%   genSrcCode, getModelChecksum, Simulink.getFileChecksum, Simulink.fileGenControl

if nargin > 1
    info = load(fullfile(Simulink.fileGenControl('get','CodeGenFolder'), [modelName, '_ert_rtw'], 'buildInfo.mat'));
else
    info = load(fullfile(Simulink.fileGenControl('get','CodeGenFolder'), 'slprj', 'ert', modelName, 'buildInfo.mat'));
end
srcFiles = info.buildInfo.Src.Files;
codeFiles = [];
checksum = [];
k = 0;
for i = 1:length(srcFiles)
    if isempty(regexp(srcFiles(i).FileName, '^ert_main.c', 'once'))
        tempFile = fullfile(srcFiles(i).Path, srcFiles(i).FileName);
        tempFile = strrep(tempFile, '$(START_DIR)', Simulink.fileGenControl('get','CodeGenFolder'));
        k = k + 1;
        codeFiles{k} = tempFile;
        checksum{k} = Simulink.getFileChecksum(codeFiles{k});
    end
end

end
